package 第2周_排序基础.第一章选择排序法;

import 第10周_冒泡排序_希尔排序和排序算法.第1章_冒泡排序法.BubbleSort;
import 第10周_冒泡排序_希尔排序和排序算法.第2章_希尔排序.ShellSort;
import 第2周_排序基础.第二章插入排序法.InsertionSort;
import 第5周_归并排序法.第一章归并排序法.MergeSort;
import 第6周_快速排序法.第一章快速排序法.QuickSort;
import 第9周_堆_优先队列和堆排序.第1章_最大堆_最小堆.HeapSort;

import java.util.Arrays;

public class SortingHelper {

    private SortingHelper(){}

    /**
     * 检测排序算法排序后是否正确
     * @param arr
     * @param <E>
     * @return
     */
    public static <E extends Comparable> boolean isSorted(E[] arr){

        for (int i = 1; i < arr.length; i++){
            if (arr[i - 1].compareTo(arr[i]) > 0){
                return false;
            }
        }
        return true;
    }

    /**
     * 排序算法的测试
     * @param name
     * @param arr
     * @param <E>
     */
    public static <E extends Comparable> void sortTest(String name, E[] arr){

        long startTime = System.nanoTime();
        if (name.equals("SelectionSort")){
            SelectionSort.sort(arr);
        }
        else if(name.equals("InsertionSort")){
            InsertionSort.sort(arr);
        }
        else if(name.equals("MergeSort")){
            MergeSort.sort(arr);
        }
        else if(name.equals("QuickSort")){
            QuickSort.sort(arr);
        } else if(name.equals("QuickSort2Ways")){
            QuickSort.sort2ways(arr);
        }else if(name.equals("HeapSort")){
            HeapSort.sort(arr);
        }else if (name.equals("HeapSort2")){
            HeapSort.sort2(arr);
        }else if(name.equals("BubbleSort")){
            BubbleSort.sort(arr);
        }else if(name.equals("BubbleSort2")){
            BubbleSort.sort2(arr);
        }else if(name.equals("ShellSort")){
            ShellSort.sort(arr);
        } else if(name.equals("ShellSort2")){
            ShellSort.sort(arr);
        }
        else if(name.equals("ShellSort3")){
            ShellSort.sort(arr);
        }

        long endTime = System.nanoTime();

        double time = (endTime - startTime) / 1000000000.0;

        if (!SortingHelper.isSorted(arr))
            throw new RuntimeException("排序错误");

        System.out.println(String.format("%s , n = %d : %f s",name,arr.length,time));
    }

}
